package org.shj.basic

/**
 * 存在同名的class 和 object时，class称为伴生类，object称为伴生对象。
 * 伴生类和伴生对象必须定义在同一个文件中。它们之间可以相互访问私有的方法或属性
 * 1. object中的内容都是class的静态内容。也就是说object中的内容class都可以在没有实例的时候直接调用。
 *    因此可以用object中的特定方法来创建class的实例，这个特定方法就是apply
 * 2. object中的apply方法就是创建class的工厂方法，可用于控制对象的生成
 */
class ApplyDemo{ //伴生类
  def apply() = println("I'm in class.")
  
  def haveATry() = {
    println("Have a try.")
  }
}

object ApplyDemo { //伴生对象
  
  def apply(): ApplyDemo = {
    println("I'm in object")
    new ApplyDemo
  }
  
  def main(args: Array[String]): Unit = {
    val a = ApplyDemo()  //调用了伴生对象的apply()方法
    a.haveATry()
    println("======")
    println(a())  //调用了伴生类的apply()方法，但是不知道为什么，多打印了一行 只有"()"的内容
    println("======")
    
  }
}